package com.unisyou;

import com.unisyou.entity.PersonEntity;
import com.unisyou.entity.StudentEntity;

import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 创建对象的 4 种方式
 */
public class Demo2 {
    public static void main(String[] args) {
        //第一种 new , 缺点:增加耦合度
        PersonEntity personEntity = new PersonEntity();
        //第二种 反射机制
        try {
            PersonEntity personEntity1 = PersonEntity.class.newInstance();
            //或者使用Constructor类
            Constructor<PersonEntity> constructor = PersonEntity.class.getConstructor();
            PersonEntity personEntity2 = constructor.newInstance();
        } catch (InstantiationException | NoSuchMethodException | InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        //第三种 采用clone 需要已经有一个分配了内存的源对象，创建新对象时，首先应该分配一个和源对象一样大的内存空间。
        //要调用clone方法需要实现Cloneable接口 , clone方法是protected的 , 实现在其对象类

        //第四种 采用序列化机制 　
        //使用序列化时，要实现实现Serializable接口，将一个对象序列化到磁盘上，而采用反序列化可以将磁盘上的对象信息转化到内存中。
        StudentEntity studentEntity = new StudentEntity();
        File file = new File("Student.obj");
        try {
            FileOutputStream fos = new FileOutputStream(file);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            //序列化对象, 写入到磁盘中
            oos.writeObject(studentEntity);

            FileInputStream fis = new FileInputStream(file);
            ObjectInputStream ois = new ObjectInputStream(fis);
            StudentEntity studentEntity1 = (StudentEntity) ois.readObject();
            studentEntity1.im();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }
}
